﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Pkcs;

namespace client
{
    class GestorSegurancaStore : GestorSeguranca
    {
        
        
        public void startStore() 
        {

            _sv = new ServiceReference1.Service1Client();
            //1 passo
            gerarSerial();
            //2 passo
            buscarCerServidor();
            //3 passo
            guardaNoCliente();

            //4 passo - Utilizador escolhe seu certificado da store
            byte[] dadosAssinados = encSignStore();

            ////7 passo
            enviarParaServidor(dadosAssinados);

        }

        public byte[] encSignStore()
        {
            //obter dados
            byte[] data = Encoding.UTF8.GetBytes(_uniqueID);
            ContentInfo cInfo = new ContentInfo(data);

            X509Store store = new X509Store(StoreName.AddressBook, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);

            X509Certificate2Collection certColl = X509Certificate2UI.SelectFromCollection(store.Certificates, "Certificados Pessoais", "Escolha um certificado", X509SelectionFlag.SingleSelection);

            CmsRecipient recipient = new CmsRecipient(certColl[0]);

            //cifrar
            EnvelopedCms envelope = new EnvelopedCms(cInfo);
            envelope.Encrypt(recipient);

            //obter dados cifrados (PKCS#7)
            byte[] dadosEncriptados = envelope.Encode(); //os dados


            //Assinar dados
            cInfo = new ContentInfo(dadosEncriptados);
            CmsSigner signer = new CmsSigner(certColl[0]);
            //calcular assinatura
            SignedCms signedCms = new SignedCms(cInfo, false); //false, com dados
            signedCms.ComputeSignature(signer);

            // obter mensagem (PKCS#7)
            byte[] dadosAssinados = signedCms.Encode();

            return dadosAssinados;
        }



    }
}
